<template>
  <input type="file" @change="handleFile" />
  <div v-if="stats.length">
    <h3>统计结果</h3>
    <div v-for="(stat, index) in stats" :key="index">
      <p>列 {{ index + 1 }}:</p>
      <ul>
        <li>平均值: {{ stat.average }}</li>
        <li>最大值: {{ stat.max }}</li>
        <li>最小值: {{ stat.min }}</li>
        <li>方差: {{ stat.variance }}</li>
      </ul>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import * as XLSX from 'xlsx';

const stats = ref([]);

// 计算平均值
const calculateAverage = (data) => data.reduce((acc, curr) => acc + curr, 0) / data.length;

// 计算方差
const calculateVariance = (data, average) =>
  data.reduce((acc, curr) => acc + (curr - average) ** 2, 0) / data.length;

// 从文件中读取并解析Excel
const handleFile = (event) => {
  const file = event.target.files[0];
  const reader = new FileReader();
  reader.onload = (e) => {
    const data = new Uint8Array(e.target.result);
    const workbook = XLSX.read(data, { type: 'array' });
    const sheetName = workbook.SheetNames[0];
    const worksheet = workbook.Sheets[sheetName];
    const json = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); // 转换为数组的数组
    processSheetData(json);
  };
  reader.readAsArrayBuffer(file);
};

// 处理Excel数据并计算统计信息
const processSheetData = (sheetData) => {
  stats.value = []; // 重置统计数据

  // 假设数据开始于第三行，第二列（根据提供的模板）
  const startRow = 2;
  const startCol = 1;

  // 动态获取列的数量（减去1是因为index从0开始）
  const numberOfColumns = sheetData[0].length - 1;

  // 遍历每一列，跳过标题行
  for (let i = startCol; i <= numberOfColumns; i++) {
    // 提取每列的数据（跳过标题行）
    const columnData = sheetData.slice(startRow).map(row => parseFloat(row[i]) || 0);

    // 计算统计数据
    const average = calculateAverage(columnData);
    const max = Math.max(...columnData);
    const min = Math.min(...columnData);
    const variance = calculateVariance(columnData, average);

    // 存储统计数据
    stats.value.push({ average, max, min, variance });
  }
};
</script>

<style scoped>
/* 这里添加样式 */
</style>
